class Camera {
public:

	static mat4 projection_matrix;
	static mat4 skybox_matrix;
	static mat4 inverse_matrix;
	
	// данная матрица является ортоматрицей камеры (без перспективы)
	// и используется для вычисления расстояния до объекта из расчета
	// краев boundary меша или координат объекта (boundart disabled) 
	// переведенные в мировые координаты
	static mat4 camera_matrix;

	void bind(){
		vec3 _position;
		// расчет позиции для наблюдающей камеры
		distance = clamp(distance,distance_limit_min,distance_limit_max);
		angle = clamp(angle,angle_limit_min,angle_limit_max);
		float z = cos(radians(angle))*distance;
		_position = vec3(-sin(radians(direction))*z,sin(radians(angle))*distance,cos(radians(direction))*z)+target;

		int vport[4];
		glGetIntegerv(GL_VIEWPORT,vport);
		vec3 f = normalize(target-_position);
		vec3 s = normalize(cross(f,vec3(0,1,0)));
		vec3 u = cross(s,f);
		mat4 camrot_matrix(
			s.x, u.x, -f.x, 0,
			s.y, u.y, -f.y, 0,
			s.z, u.z, -f.z, 0,
			0,   0,   0,    1
		);
		
		projection_matrix = perspective(fovy,(float)vport[2]/vport[3],znear,zfar);
		skybox_matrix = projection_matrix * camrot_matrix; // перспектива + поворот
		camera_matrix = translate(camrot_matrix,-_position); // поворот + сдвиг
		projection_matrix = projection_matrix * camera_matrix; // перспектива+поворот+сдвиг
		inverse_matrix = inverse(projection_matrix);
	}

	vec3 target; // куда мы смотрим

	float distance; // дистанция до объекта
	float distance_speed; // // множитель скорости изменения дистанции
	float distance_limit_max; // лимит дистанции макс
	float distance_limit_min; // лимит дистанции мин
	float angle; // угол обзора
	float angle_speed; // множитель скорости наклона
	float angle_limit_max; // лимит угла макс
	float angle_limit_min; // лимит угла мин
	float direction; // напрвление
	float direction_speed; // множитель скорости поворота
	float znear;
	float zfar;
	float fovy;

	bool mouse_control; // если true то перехватывае события мыши в сцене
						// и если нажата правая кнопка то крутит камеру
						// и зум на колесике
	
	Camera(){
		distance = 2;
		distance_limit_max = 5;
		distance_limit_min = 2;
		distance_speed = 0.5;
		angle = 40;
		angle_limit_max = 80;
		angle_limit_min = 10;
		angle_speed = 1;
		direction = 0;
		direction_speed = 1;
		target = vec3(0,0,0);
		znear = 0.0001;
		zfar = 1000.0;
		fovy = 45;
		mouse_control = true;
	}

};

mat4 Camera::projection_matrix;
mat4 Camera::skybox_matrix;
mat4 Camera::inverse_matrix;
mat4 Camera::camera_matrix;